package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.dto.OrdersDto;
import com.itheima.reggie.entity.*;
import com.itheima.reggie.mapper.OrderMapper;
import com.itheima.reggie.service.AddressBookService;
import com.itheima.reggie.service.OrderDetailService;
import com.itheima.reggie.service.OrderService;
import com.itheima.reggie.service.ShoppingCartService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;


@Service
@Transactional
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderMapper mapper;

    @Autowired
    private AddressBookService addressBookService;

    @Autowired
    private ShoppingCartService shoppingCartService;

    @Autowired
    private OrderDetailService orderDetailService;

    /**
     * 移动端--分页查询订单
     *     前端只需要两个数据  total 和 records
     * @param pageParam 分页参数
     * @return 当前页查询到的数据
     */
    @Override
    public IPage<OrdersDto> getList(PageParam pageParam) {
        //设置分页参数
        IPage<Orders> page = new Page<>(pageParam.getPage(),pageParam.getPageSize());
        //设置查询条件
        LambdaQueryWrapper<Orders> lqw = new LambdaQueryWrapper<>();
        lqw.orderByDesc(Orders::getCheckoutTime);
        //执行分页查询
        mapper.selectPage(page,lqw);

        //创建IPage<OrdersDto>集合,用来封装List<OrdersDto>集合来返回
        IPage<OrdersDto> dtoIPage = new Page<>();

        //设置total数据
        dtoIPage.setTotal(page.getTotal());

        //设置records数据
        //设置List<OrdersDto>中的数据
        List<OrdersDto> ordersDtoList = page.getRecords().stream().map(orders -> {
            //每遍历一次orders对象就创建一个ordersDto对象
            OrdersDto ordersDto = new OrdersDto();
            //将orders对象中的数据拷贝到ordersDto对象中
            BeanUtils.copyProperties(orders,ordersDto);
            //查询并设置商品的详细数据
            ordersDto.setOrderDetails(orderDetailService.findByOrderId(orders.getNumber()));
            //返回ordersDto对象
            return ordersDto;
        }).collect(Collectors.toList());

        //设置并返回IPage<OrdersDto>集合数据
        return dtoIPage.setRecords(ordersDtoList);
    }


    /**
     * 添加订单
     * 1. 提交订单，要往两张表添加数据 ：  订单表(orders) 和 订单详情表(order_detail)
     * 2. 必须先往订单表里面添加记录，然后再往详情表里面添加记录
     *
     * @param orders
     * @return
     */
    @Override
    public int add(Orders orders, User user) {

        //1. 往订单表里面添加数据
        //1.1 先补充orders的数据
        orders.setId(IdWorker.getId());
        //1.1.1 设置number， 数量
        orders.setNumber(orders.getId() + "");
//        orders.setNumber(UUID.randomUUID().toString().replace("-",""));
        //1.1.2 设置订单的状态： 1待付款，2待派送，3已派送，4已完成，5已取消
        orders.setStatus(1);
        //1.1.3 设置用户id
        orders.setUserId(user.getId());
        //1.1.4 设置地址的id  不需要设置，因为页面已经提供了
        //1.1.5 设置提交订单时间
        orders.setOrderTime(LocalDateTime.now());
        //1.1.6 设置付款时间
        orders.setCheckoutTime(LocalDateTime.now());
        //1.1.7 设置付款方式 不需要设置，因为页面已经提供了
        //1.1.8 设置总金额  不需要设置，因为页面已经提供了
        //1.1.9 设置备注 不需要设置，因为页面已经提供了
        //1.1.10 提交订单的用户用户名
        orders.setUserName(user.getName());

        AddressBook addressBook = addressBookService.getById(orders.getAddressBookId());
        //1.1.11 收货人的电话
        orders.setPhone(addressBook.getPhone());
        //1.1.12 收货人的地址 = 省份  + 城市 + 地区 + 详细地址
        orders.setAddress(
                (addressBook.getProvinceName() != null ? addressBook.getProvinceName() : "") +
                        (addressBook.getCityName() != null ? addressBook.getCityName() : "") +
                        (addressBook.getDistrictName() != null ? addressBook.getDistrictName() : "") +
                        (addressBook.getDetail() != null ? addressBook.getDetail() : "")
        );
        //1.1.13 收货人的名字
        orders.setConsignee(addressBook.getConsignee());

        //1.2 往订单表添加订单
        int row = mapper.insert(orders);

        //2. 往订单详情表添加数据
        //2.1 先从购物车里面拿出来数据
        List<ShoppingCart> cartList = shoppingCartService.list();


        int row2 = 0;

        //2.2 遍历购物车的数据，每一条购物车数据就是一个订单详情对象
        for (ShoppingCart cart : cartList) {

            //2.3 遍历一次购物车对象，就创建一个订单详情对象
            OrderDetail orderDetail = new OrderDetail();
            orderDetail.setId(IdWorker.getId());

            //2.4 把购物车条目对象拷贝到订单详情对象身上
            BeanUtils.copyProperties(cart, orderDetail);

            //2.5 设置属于哪个订单
            orderDetail.setOrderId(orders.getId());

            //2.6 最后把这个订单详情对象，添加到订单详情表即可！
            row2 += orderDetailService.add(orderDetail);
        }


        //3. 如果订单都已经添加好了，那么就情况购物车
        if (row > 0 && row2 == cartList.size()) {
            shoppingCartService.clean();
        }


        return row > 0 && row2 == cartList.size() ? 1 : 0;
    }

    @Override
    public IPage<Orders> findPage(Integer page, Integer pageSize, Long number, String beginTime, String endTime) {
        //先做分页查询
        IPage<Orders> ordersIPage = new Page<>(page, pageSize);
        //判断有没有查询条件
        LambdaQueryWrapper<Orders> lqw = new LambdaQueryWrapper<>();
        //lqw.like(number != null, Orders::getNumber, number).gt(beginTime != null, Orders::getOrderTime, beginTime).lt(endTime != null, Orders::getOrderTime, endTime);
        lqw.like(number != null, Orders::getNumber, number).between(beginTime != null && endTime != null, Orders::getOrderTime, beginTime, endTime);
        return mapper.selectPage(ordersIPage, lqw);
    }
}
